移动分析支持通过符号表对 iOS App 的闪退日志进行反向解析,以便定位 App 中的问题代码,帮助提高排查、解决线上异常问题的效率,同时提供 iOS 符号表管理功能以便导入、查询符号表并进行符号表反解测试。
什么是符号表
符号表是内存地址与函数名、文件名、行号的映射表。符号表元素如下所示:
<起始地址> <结束地址> <函数> [<文件名:行号>]
iOS App 出现闪退时,闪退日志中的 Crash 堆栈为混淆后的二进制信息,需要通过符号表对这些二进制堆栈信息进行反向解析,将其转换为可读的函数名和行数,以便定位 App 中出现问题的代码。
导入 iOS 符号表
对闪退日志进行符号反解前,要先上传符号表。在 iOS 平台中,dSYM 文件是保存符号表的目标文件,文件名通常为 xxx.app.dSYM
,建议每次构建或发布 App 的时候,备份好 dSYM 文件。
上传 iOS 符号表的步骤如下:
在 dSYM 文件当前目录下,通过 Linux 命令
tar -czvf symbol.tgz ./xxx.app.dSYM
将 dSYM 文件压缩成 tgz 包。登录 mPaaS 控制台,选择目标应用后,从左侧导航栏进入 移动分析 > 性能分析 > iOS 符号表管理 页面。
点击 导入APP 符号表,在导入符号表弹窗中,输入符号表信息,并上传相应的符号表。
版本:App 版本号。
Module Name:iOS App 二进制文件名称,存储在符号表文件里面用来标识出对应的 App 二进制文件,以方便用户匹配 App 二进制文件和 App 的符号表文件。
此处填写 App 主 module 的 moduleName,例如打出的包是
Produce.app
, 那么 moduleName 为Produce
。UUID:通用唯一识别码(Universally Unique Identifier,简称 UUID),是机器生成的唯一标识符。iOS 应用每次编译时都会生成一个 UUID,为保证反解成功,堆栈的 UUID 和应用的符号表文件中的 UUID 必须保持一致(也就是来自同一次编译)。还原 Crash 堆栈信息时,仅当导入的符号表文件的 UUID 与闪退日志中的 UUID 一致时,才能准确地对堆栈进行解析还原。
此处填写 App 主 module 的 UUID,如果有多个,选择其中一个填写即可。例如有 armv7、arm64 两种架构,则会有两个 UUID,任选一个填写即可。格式上,UUID 字符串需去掉“-”,并且全部小写,例如:b7583434dc5e377bb4d8e7b69bf4c1fb。
上传符号表:支持两种上传方式。
URL 上传:输入符号表压缩后的 tgz 文件的 URL。如果指定 URL 下没有符号表文件,会返回报错信息。
本地上传:上传本地的符号表文件。
点击 导入,导入符号表。
在 iOS 符号表管理页面中查看符号表的导入状态。如果符号表状态为 Done,表示导入成功;如果为 Failed,则表示导入失败,请根据错误提示重新导入符号表文件。
导入的符号表都将展示在符号表管理页面,可根据 App 版本进行查询。
反解测试
反解测试用于验证导入的符号表文件是否有效。
反解测试的步骤如下:
在 iOS 符号表列表中,选择导入成功的目标符号表,点击操作列下的 反解测试。
在 原始日志文本 栏中输入需要反解的闪退日志内容后,点击 反解日志。日志反解结果 栏将显示反解后的日志文本,如果反解失败,会提供失败原因,例如“UUID 不匹配”等。